PIC Tutorial Six - I2C EEPROM Programming
       
       These tutorials require the Main Board, the LCD Board, 
      and various of the I2C Boards, as written the tutorials use the LCD Board 
      on PortA and the I2C Boards on PortB - although these could easily be 
      swapped over, as the I2C Boards don't use either of the two 'difficult' 
      pins for PortA, pins 4 and 5, as outputs. Download 
      zipped tutorial files. 
       As with the LCD Tutorial, the idea is to implement a 
      reusable set of I2C routines. 
       Rather than showing the routines on the page as with 
      earlier tutorials (they are getting quite lengthy now), I'm only going to 
      store them in the pages download ZIP 
      file so you will need to download them. As the I2C tutorials use a 
      number of different boards, each section is headed by the I2C boards 
      required in bold type. 
       I2C is a protocol designed by Philips Semiconductors, 
      and is for communications between I/C's over a two wire synchronous serial 
      bus, devices are classed as either 'Master' or 'Slave', for our purposes 
      the Main Board processor is the 'Master', and any other devices are 
      'Slaves'. The initial tutorials use a 24C04, a 512 byte EEPROM memory 
      chip, commonly used for storing the settings in modern TV's and VCR's, 
      where they are used to store all the customer settings (tuning, volume, 
      brightness etc.) and the internal calibration values for the set, which 
      are normally accessed through a special 'service mode'. These chips 
      provide non-volatile memory as a series of 256 byte 'pages', so the 24C04 
      provides two 'pages' giving 512 bytes of memory. The 24C02 uses 'standard 
      addressing', which gives the 256 byte page limit, other larger chips use 
      'extended addressing', giving a possible 16 bit address space, I've used a 
      24C256 which uses a 15 bit address space, giving 32,768 of memory space. 
      To address these you require two bytes of address data, the programs 
      already include these (but commented out), I've uncommented them for 
      copies of the first two tutorials and called them 6_1a and 6_2a, if you 
      want to use an EEPROM larger than a 24C16 you will need to use these 
      extended addressing versions. 
      I2C EEPROM Board
  The first tutorial writes sequential numbers through one 
      entire page of memory, and then reads them back, 4 bytes at a time, 
      displaying them on the LCD, separated by about half a second between 
      updates. The second tutorial demonstrates 'sequential writing', the first 
      tutorial uses 'byte writing' (which is why it displays 'Writing..' for a 
      couple of seconds) - a write is fairly slow to EEPROM, taking around 10mS 
      to complete - 'sequential writing' allows you to store a number of bytes 
      in RAM inside the EEPROM chip (a maximum of 8 for the 24C04) and then 
      write them all to EEPROM with a single write delay. Tutorial 2 writes 4 
      bytes at once, to demonstrate how this is done. The third tutorial is 
      simply a cut-down version of the first, I've included it as a useful tool, 
      it simply reads one page of the EEPROM and displays it as tutorial 1 does 
      - useful for checking the contents of an EEPROM. You can deal with the 
      EEPROM write delay in a couple of ways, firstly you can introduce a 
      software delay, and this option is included in the tutorials (but 
      commented out), or you can keep checking until the chip is ready, this is 
      the method I've used in these tutorials, although if you want you can 
      comment that line out and un-comment the 'call delay10' line instead. 
      I2C Clock Board, and I2C Switch Board
  Now we move onto the I2C Clock board, basically we use 
      exactly the same I2C routines, the only difference being in the way we 
      manipulate the data, we need to read the clock registers from the chip 
      (using a sequential read), apply a little processing, and then display 
      them on the LCD. Actually setting the clock is somewhat more complicated, 
      and the biggest difference is the routines for reading the switch board, 
      and setting the clock chip values - which are then written back to the 
      chip with a sequential write. The four buttons used are (from left to 
      right), 'Set', 'Up', 'Down', and 'Next' - in the initial display mode the 
      only button which has an effect is the 'Set' button, this jumps to the 
      'Clock Set' mode, and starts a flashing cursor on the tens of hours. From 
      this point all four buttons work, pressing 'Set' again will return to 
      display mode, updating the clock values (and zeroing the seconds). 
      Pressing 'Up' will increase the value under the cursor, and 'Down' will 
      decrease the value, with '0' being the lower limit, and '9' being the 
      upper one - I don't currently take account of the different maximum values 
      for particular digits (i.e. tens of hours doesn't go higher than 2), but 
      rely on setting them sensibly. The 'Next' button moves on to the next 
      digit, and if pressed while on the last digit (years units) will return to 
      display mode, just like pressing the 'Set' button. I also don't currently 
      take any account of the correct years, the PCF8583 only provides 0-3 for 
      the years, with 0 being a leap year - extra software routines will be 
      required to do this, with the actual values stored in spare PCF8583 EEPROM 
      memory, and updated when the year changes (remembering that the year might 
      change while the processor is powered down, and the clock is running on 
      it's back-up battery). 
      I2C A2D Board, and I2C Switch Board
  Again, the A2D board uses the same basic I2C routines as 
      before (but with a different chip address for the PCF8591) as with the I2C 
      Clock Board the differences come in the manipulation of the data. As the 
      board also includes an EEPROM socket this can be used to store samples 
      from the A2D chip - with a single 24C256 we can store up to 32,768 eight 
      bit samples - this introduces a slight 'snag', the 24C256 uses 'extended 
      addressing', while the PCF8591 only uses 'standard addressing', however we 
      can still use the same I2C routines by using a flag to tell the routines 
      which addressing mode to use, simply switching the flag for the different 
      chips - this flag switching becomes part of the reusable I2C routines. 
       
     |